package org.peacockteam.gu;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.openintents.sensorsimulator.db.SensorSimulator;
import org.openintents.sensorsimulator.hardware.SensorEventListener;
import org.openintents.sensorsimulator.hardware.SensorManagerSimulator;
import org.wiigee.control.AndroidWiigee;
import org.wiigee.event.AccelerationEvent;
import org.wiigee.event.AccelerationListener;
import org.wiigee.event.GestureEvent;
import org.wiigee.event.GestureListener;
import org.wiigee.event.MotionStartEvent;
import org.wiigee.event.MotionStopEvent;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorListener;
import android.hardware.SensorManager;
import android.os.Build;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.TextView;
public class GesturesUnlockActivity extends Activity {
private SensorManager mSensorManager;
private SensorManagerSimulator mSensorManagerSimulator;
final private AndroidWiigee wiigee = new AndroidWiigee();
final private List<AccelerationEvent> eventList = new ArrayList<AccelerationEvent>();
private static int TRAIN_BUTTON = 1;
private static int CLOSE_GESTURE_BUTTON = 2;
private static int RECOGNITION_BUTTON = 3;
// TODO: let user change ulr from app
private static String ACCLAB_URL = "http://rmining.net:3000/1.0/acc/put";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if (isEmulator()) {
mSensorManagerSimulator = SensorManagerSimulator.getSystemService(this, SENSOR_SERVICE);
mSensorManagerSimulator.connectSimulator();
} else {
mSensorManager = (SensorManager) this.getSystemService(SENSOR_SERVICE);
}
// We use IMEI code for identity this device (really?) in acclab
TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
final String deviceId = telephonyManager.getDeviceId();
if (deviceId.equals("000000000000000")) {
// XXX: do not pull this data
// or trying generate unqique id for emulator (wifi, mac, or?)
}
// wiigee.getDevice().resetAccelerationFilters();
// wiigee.getDevice().addAccelerationFilter(new LowPassFilter());
// wiigee.getDevice().addAccelerationFilter(new IdleStateFilter());
// wiigee.getDevice().addAccelerationFilter(new IdleStateFilter());
// wiigee.getDevice().addAccelerationFilter(new MotionDetectFilter(this));
// wiigee.getDevice().addAccelerationFilter(new DirectionalEquivalenceFilter());
final TextView textview_number_of_samples = (TextView) findViewById(R.id.textView_number_of_samples);
wiigee.getDevice().addAccelerationListener(new AccelerationListener() {
@Override
public void motionStopReceived(MotionStopEvent event) {
// TODO Auto-generated method stub
}
@Override
public void motionStartReceived(MotionStartEvent event) {
// TODO Auto-generated method stub
}
@Override
public void accelerationReceived(final AccelerationEvent event) {
eventList.add(event);
textview_number_of_samples.setText(Integer.toString(eventList.size()));
// XXX: send adaptive
if (eventList.size() < 200) {
return;
}
final JSONArray dataArray = new JSONArray();
try {
for (AccelerationEvent ev : eventList) {
JSONObject data = new JSONObject();
data.put("timestamp", new Date().getTime())
.put("device_id", deviceId)
.put("device_name", "Emulator")
.put("data",
new JSONObject().put("x", ev.getX())
.put("y", ev.getY())
.put("z", ev.getY()));
dataArray.put(data);
}
} catch (JSONException e) {
e.printStackTrace();
}
new Thread(new Runnable() {
@Override
public void run() {
postData(dataArray.toString());
}
}).start();
eventList.clear();
}
});
wiigee.setCloseGestureButton(CLOSE_GESTURE_BUTTON);
wiigee.setRecognitionButton(RECOGNITION_BUTTON);
wiigee.setTrainButton(TRAIN_BUTTON);
// Some controls for wiigee
final Button button_train = (Button) findViewById(R.id.button_train);
final Button button_recognition = (Button) findViewById(R.id.button_recognition);
final Button button_close_gesture = (Button) findViewById(R.id.button_close_gesture);
final TextView textview_status = (TextView) findViewById(R.id.textView_status);
wiigee.addGestureListener(new GestureListener() {
@Override
public void gestureReceived(GestureEvent event) {
Log.i(getClass().toString(), "Geastures " + event);
textview_status.setText("Rec: " + event.getId() + " Prob:" + event.getProbability());
}
});
button_recognition.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
textview_status.setText("Recognition...");
wiigee.getDevice().fireButtonPressedEvent(RECOGNITION_BUTTON);
}
if (event.getAction() == MotionEvent.ACTION_UP) {
textview_status.setText("Recognition done");
wiigee.getDevice().fireButtonReleasedEvent(RECOGNITION_BUTTON);
}
return false;
}
});
button_train.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
textview_status.setText("Training...");
wiigee.getDevice().fireButtonPressedEvent(TRAIN_BUTTON);
}
if (event.getAction() == MotionEvent.ACTION_UP) {
textview_status.setText("Train done");
wiigee.getDevice().fireButtonReleasedEvent(TRAIN_BUTTON);
}
return false;
}
});
button_close_gesture.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
textview_status.setText("Gesture closed");
wiigee.getDevice().fireButtonPressedEvent(CLOSE_GESTURE_BUTTON);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.prefs:
startActivity(new Intent(getApplicationContext(), PreferencesView.class));
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
protected void onResume() {
super.onResume();
if (isEmulator()) {
mSensorManagerSimulator.registerListener((SensorEventListener) wiigee.getDevice(),
mSensorManagerSimulator.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_GAME);
} else {
mSensorManager.registerListener((android.hardware.SensorEventListener) wiigee.getDevice(),
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_GAME);
}
try {
wiigee.getDevice().setAccelerationEnabled(true);
} catch (IOException e) {
Log.e(getClass().toString(), e.getMessage(), e);
}
}
@Override
protected void onPause() {
super.onPause();
if (isEmulator()) {
mSensorManagerSimulator.unregisterListener((SensorEventListener) wiigee.getDevice());
} else {
mSensorManager.unregisterListener((android.hardware.SensorEventListener) wiigee.getDevice());
}
try {
wiigee.getDevice().setAccelerationEnabled(false);
} catch (Exception e) {
Log.e(getClass().toString(), e.getMessage(), e);
}
}
public static boolean isEmulator() {
return Build.MANUFACTURER.equals("unknown");
}
// XXX: rewrite this!
public void postData(String data) {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(ACCLAB_URL);
try {
httppost.setEntity(new StringEntity(data.toString()));
httppost.setHeader("Content-type", "application/json");
HttpResponse response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
}
}